
function HTMLParser() {
   this.document = null;
   this.input = null;
   this.parent = null;
   this.level = 0;
   this.defaultToXHTML = true;
   this.tidy = false;
   this.NS = "http://www.w3.org/1999/xhtml";
   this.$Char      = "(?: \\u0009 | \\u000A | \\u000D | [\\u0020-\\uD7FF] | [\\uE000-\\uFFFD] | [\\u10000-\\u10FFFF] )";
   this.$Letter    = "(?: [\\u0041-\\u005a]|[\\u0061-\\u007a]|[\\u0030-\\u0039] )";
   this.$Digit     = "(?: [\\u0030-\\u0039])";
   this.$NameChar  = "(?: $Letter | $Digit | \\. | \\- | _ )";
   this.$Name      = "(?: $Letter | _ ) $NameChar*";
   this.$QName     = "(?: $Name : )? $Name";
   this.$Prefixed  = "( $Name :)? ($Name)";
   this.$StartTag  = "< ( $QName ) ( (?: $S $Attribute)* ) $S? >";
   this.$EndTag    = "</ ( $QName ) $S? >";
   this.$EmptyTag  = "< ( $QName ) ( (?: $S $Attribute)* ) $S? />";
   this.$S         = "(:?  (?: \\u0020 | \\u0009 | \\u000D | \\u000A )+ )";
   this.$Attribute = "( $QName ) $Eq ( $Literal )";
   this.$Eq        = "$S? = $S?";
   this.$StrictLiteral   = "(?: \" (?: [^<&\"] | $Reference )* \" ) | (?: ' (?: [^<&'] | $Reference )* ' )";
   this.$Literal   = "(?: \" (?: [^\"] )* \" ) | (?: ' (?: [^'] )* ' )";
   this.$Reference = "(?: $EntityRef | $CharRef )";
   this.$CharRef   = "&# ([0-9]+ | x[0-9a-fA-F]+ ) ;";
   this.$EntityRef = "& ($Name) ;";
   this.$Characters  = "[^<&]+";
   this.$Comment     = "<!-- ( (?: (?: (?!- ) $Char ) | (?: - (?: (?!- ) $Char ) ) )* ) -->";
   this.$CommentStart = "<!--";
   this.$CommentEnd = "-->";
   this.$NonDash    = "[^-]+";
   this.$PI          = "<\\? $Char*? \\?>";
   var current = this;
   this.lexer = {
     Attribute: new RegExp("^"+current._resolve(current.$Attribute)),
     Characters: new RegExp("^"+current._resolve(current.$Characters)),
     CharRef: new RegExp("^"+current._resolve(current.$CharRef)),
     Comment: new RegExp("^"+current._resolve(current.$Comment)),
     CommentEnd: new RegExp("^"+current._resolve(current.$CommentEnd)),
     CommentStart: new RegExp("^"+current._resolve(current.$CommentStart)),
     DigitStart: new RegExp("^[0-9]"),
     EmptyTag: new RegExp("^"+current._resolve(current.$EmptyTag)),
     EndTag: new RegExp("^"+current._resolve(current.$EndTag)),
     EntityRef: new RegExp("^"+current._resolve(current.$EntityRef)),
     Eq: new RegExp("^"+current._resolve(current.$Eq)),
     Literal: new RegExp("^"+current._resolve(current.$Literal)),
     NonDash: new RegExp("^"+current._resolve(current.$NonDash)),
     PI: new RegExp("^"+current._resolve(current.$PI)),
     QName: new RegExp("^"+current._resolve(current.$Prefixed)),
     StartTag: new RegExp("^"+current._resolve(current.$StartTag))
   };
   this.emptyElements = {
     "area" : true,
     "base" : true,
     "basefont" : true,
     "br" : true,
     "col" : true,
     "frame" : true,
     "hr" : true,
     "img" : true,
     "input" : true,
     "isindex" : true,
     "link" : true,
     "meta" : true,
     "param" : true
   };
   
   this.generalEntities = {
      "cularr" : "\u21B6", // ANTICLOCKWISE TOP SEMICIRCLE ARROW 
      "curarr" : "\u21B7", // CLOCKWISE TOP SEMICIRCLE ARROW 
      "dArr" : "\u21D3", // DOWNWARDS DOUBLE ARROW 
      "darr2" : "\u21CA", // DOWNWARDS PAIRED ARROWS 
      "dharl" : "\u21C3", // DOWNWARDS HARPOON WITH BARB LEFTWARDS 
      "dharr" : "\u21C2", // DOWNWARDS HARPOON WITH BARB RIGHTWARDS 
      "dlarr" : "\u2199", // SOUTH WEST ARROW 
      "drarr" : "\u2198", // SOUTH EAST ARROW 
      "hArr" : "\u21D4", // LEFT RIGHT DOUBLE ARROW 
      "harr" : "\u2194", // LEFT RIGHT ARROW 
      "harrw" : "\u21AD", // LEFT RIGHT WAVE ARROW 
      "lAarr" : "\u21DA", // LEFTWARDS TRIPLE ARROW 
      "Larr" : "\u219E", // LEFTWARDS TWO HEADED ARROW 
      "larr2" : "\u21C7", // LEFTWARDS PAIRED ARROWS 
      "larrhk" : "\u21A9", // LEFTWARDS ARROW WITH HOOK 
      "larrlp" : "\u21AB", // LEFTWARDS ARROW WITH LOOP 
      "larrtl" : "\u21A2", // LEFTWARDS ARROW WITH TAIL 
      "lhard" : "\u21BD", // LEFTWARDS HARPOON WITH BARB DOWNWARDS 
      "lharu" : "\u21BC", // LEFTWARDS HARPOON WITH BARB UPWARDS 
      "lrarr2" : "\u21C6", // LEFTWARDS ARROW OVER RIGHTWARDS ARROW 
      "lrhar2" : "\u21CB", // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON 
      "lsh" : "\u21B0", // UPWARDS ARROW WITH TIP LEFTWARDS 
      "map" : "\u21A6", // RIGHTWARDS ARROW FROM BAR 
      "mumap" : "\u22B8", // MULTIMAP 
      "nearr" : "\u2197", // NORTH EAST ARROW 
      "nhArr" : "\u21CE", // LEFT RIGHT DOUBLE ARROW WITH STROKE 
      "nharr" : "\u21AE", // LEFT RIGHT ARROW WITH STROKE 
      "nlArr" : "\u21CD", // LEFTWARDS DOUBLE ARROW WITH STROKE 
      "nlarr" : "\u219A", // LEFTWARDS ARROW WITH STROKE 
      "nrArr" : "\u21CF", // RIGHTWARDS DOUBLE ARROW WITH STROKE 
      "nrarr" : "\u219B", // RIGHTWARDS ARROW WITH STROKE 
      "nwarr" : "\u2196", // NORTH WEST ARROW 
      "olarr" : "\u21BA", // ANTICLOCKWISE OPEN CIRCLE ARROW 
      "orarr" : "\u21BB", // CLOCKWISE OPEN CIRCLE ARROW 
      "rAarr" : "\u21DB", // RIGHTWARDS TRIPLE ARROW 
      "Rarr" : "\u21A0", // RIGHTWARDS TWO HEADED ARROW 
      "rarr2" : "\u21C9", // RIGHTWARDS PAIRED ARROWS 
      "rarrhk" : "\u21AA", // RIGHTWARDS ARROW WITH HOOK 
      "rarrlp" : "\u21AC", // RIGHTWARDS ARROW WITH LOOP 
      "rarrtl" : "\u21A3", // RIGHTWARDS ARROW WITH TAIL 
      "rarrw" : "\u219D", // RIGHTWARDS WAVE ARROW 
      "rhard" : "\u21C1", // RIGHTWARDS HARPOON WITH BARB DOWNWARDS 
      "rharu" : "\u21C0", // RIGHTWARDS HARPOON WITH BARB UPWARDS 
      "rlarr2" : "\u21C4", // RIGHTWARDS ARROW OVER LEFTWARDS ARROW 
      "rlhar2" : "\u21CC", // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON 
      "rsh" : "\u21B1", // UPWARDS ARROW WITH TIP RIGHTWARDS 
      "uArr" : "\u21D1", // UPWARDS DOUBLE ARROW 
      "uarr2" : "\u21C8", // UPWARDS PAIRED ARROWS 
      "uharl" : "\u21BF", // UPWARDS HARPOON WITH BARB LEFTWARDS 
      "uharr" : "\u21BE", // UPWARDS HARPOON WITH BARB RIGHTWARDS 
      "vArr" : "\u21D5", // UP DOWN DOUBLE ARROW 
      "varr" : "\u2195", // UP DOWN ARROW 
      "xhArr" : "\u27FA", // LONG LEFT RIGHT DOUBLE ARROW 
      "xharr" : "\u27F7", // LONG LEFT RIGHT ARROW 
      "xlArr" : "\u27F8", // LONG LEFTWARDS DOUBLE ARROW 
      "xrArr" : "\u27F9", // LONG RIGHTWARDS DOUBLE ARROW 
      "amalg" : "\u2A3F", // AMALGAMATION OR COPRODUCT 
      "Barwed" : "\u2306", // PERSPECTIVE 
      "barwed" : "\u2305", // PROJECTIVE 
      "Cap" : "\u22D2", // DOUBLE INTERSECTION 
      "coprod" : "\u2210", // N-ARY COPRODUCT 
      "Cup" : "\u22D3", // DOUBLE UNION 
      "cuvee" : "\u22CE", // CURLY LOGICAL OR 
      "cuwed" : "\u22CF", // CURLY LOGICAL AND 
      "diam" : "\u22C4", // DIAMOND OPERATOR 
      "divonx" : "\u22C7", // DIVISION TIMES 
      "intcal" : "\u22BA", // INTERCALATE 
      "lthree" : "\u22CB", // LEFT SEMIDIRECT PRODUCT 
      "ltimes" : "\u22C9", // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT 
      "minusb" : "\u229F", // SQUARED MINUS 
      "oast" : "\u229B", // CIRCLED ASTERISK OPERATOR 
      "ocir" : "\u229A", // CIRCLED RING OPERATOR 
      "odash" : "\u229D", // CIRCLED DASH 
      "odot" : "\u2299", // CIRCLED DOT OPERATOR 
      "ominus" : "\u2296", // CIRCLED MINUS 
      "oplus" : "\u2295", // CIRCLED PLUS 
      "osol" : "\u2298", // CIRCLED DIVISION SLASH 
      "otimes" : "\u2297", // CIRCLED TIMES 
      "plusb" : "\u229E", // SQUARED PLUS 
      "plusdo" : "\u2214", // DOT PLUS 
      "prod" : "\u220F", // N-ARY PRODUCT 
      "rthree" : "\u22CC", // RIGHT SEMIDIRECT PRODUCT 
      "rtimes" : "\u22CA", // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT 
      "sdot" : "\u22C5", // DOT OPERATOR 
      "sdotb" : "\u22A1", // SQUARED DOT OPERATOR 
      "setmn" : "\u2216", // SET MINUS 
      "sqcap" : "\u2293", // SQUARE CAP 
      "sqcup" : "\u2294", // SQUARE CUP 
      "ssetmn" : "\u2216", // SET MINUS 
      "sstarf" : "\u22C6", // STAR OPERATOR 
      "sum" : "\u2211", // N-ARY SUMMATION 
      "timesb" : "\u22A0", // SQUARED TIMES 
      "top" : "\u22A4", // DOWN TACK 
      "uplus" : "\u228E", // MULTISET UNION 
      "wreath" : "\u2240", // WREATH PRODUCT 
      "xcirc" : "\u25EF", // LARGE CIRCLE 
      "xdtri" : "\u25BD", // WHITE DOWN-POINTING TRIANGLE 
      "xutri" : "\u25B3", // WHITE UP-POINTING TRIANGLE 
      "dlcorn" : "\u231E", // BOTTOM LEFT CORNER 
      "drcorn" : "\u231F", // BOTTOM RIGHT CORNER 
      "lceil" : "\u2308", // LEFT CEILING 
      "lfloor" : "\u230A", // LEFT FLOOR 
      "lpargt" : "\u29A0", // SPHERICAL ANGLE OPENING LEFT 
      "rceil" : "\u2309", // RIGHT CEILING 
      "rfloor" : "\u230B", // RIGHT FLOOR 
      "rpargt" : "\u2994", // RIGHT ARC GREATER-THAN BRACKET 
      "ulcorn" : "\u231C", // TOP LEFT CORNER 
      "urcorn" : "\u231D", // TOP RIGHT CORNER 
      "gnap" : "\u2A8A", // GREATER-THAN AND NOT APPROXIMATE 
      "gnE" : "\u2269", // GREATER-THAN BUT NOT EQUAL TO 
      "gne" : "\u2A88", // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO 
      "gnsim" : "\u22E7", // GREATER-THAN BUT NOT EQUIVALENT TO 
      "gvnE" : "\u2269\uFE00", // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke 
      "lnap" : "\u2A89", // LESS-THAN AND NOT APPROXIMATE 
      "lnE" : "\u2268", // LESS-THAN BUT NOT EQUAL TO 
      "lne" : "\u2A87", // LESS-THAN AND SINGLE-LINE NOT EQUAL TO 
      "lnsim" : "\u22E6", // LESS-THAN BUT NOT EQUIVALENT TO 
      "lvnE" : "\u2268\uFE00", // LESS-THAN BUT NOT EQUAL TO - with vertical stroke 
      "nap" : "\u2249", // NOT ALMOST EQUAL TO 
      "ncong" : "\u2247", // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO 
      "nequiv" : "\u2262", // NOT IDENTICAL TO 
      "ngE" : "\u2267\u0338", // GREATER-THAN OVER EQUAL TO with slash 
      "nge" : "\u2271", // NEITHER GREATER-THAN NOR EQUAL TO 
      "nges" : "\u2A7E\u0338", // GREATER-THAN OR SLANTED EQUAL TO with slash 
      "ngt" : "\u226F", // NOT GREATER-THAN 
      "nlE" : "\u2266\u0338", // LESS-THAN OVER EQUAL TO with slash 
      "nle" : "\u2270", // NEITHER LESS-THAN NOR EQUAL TO 
      "nles" : "\u2A7D\u0338", // LESS-THAN OR SLANTED EQUAL TO with slash 
      "nlt" : "\u226E", // NOT LESS-THAN 
      "nltri" : "\u22EA", // NOT NORMAL SUBGROUP OF 
      "nltrie" : "\u22EC", // NOT NORMAL SUBGROUP OF OR EQUAL TO 
      "nmid" : "\u2224", // DOES NOT DIVIDE 
      "npar" : "\u2226", // NOT PARALLEL TO 
      "npr" : "\u2280", // DOES NOT PRECEDE 
      "npre" : "\u2AAF\u0338", // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash 
      "nrtri" : "\u22EB", // DOES NOT CONTAIN AS NORMAL SUBGROUP 
      "nrtrie" : "\u22ED", // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL 
      "nsc" : "\u2281", // DOES NOT SUCCEED 
      "nsce" : "\u2AB0\u0338", // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash 
      "nsim" : "\u2241", // NOT TILDE 
      "nsime" : "\u2244", // NOT ASYMPTOTICALLY EQUAL TO 
      "nsmid" : "\u2224", // DOES NOT DIVIDE 
      "nspar" : "\u2226", // NOT PARALLEL TO 
      "nsub" : "\u2284", // NOT A SUBSET OF 
      "nsubE" : "\u2AC5\u0338", // SUBSET OF ABOVE EQUALS SIGN with slash 
      "nsube" : "\u2288", // NEITHER A SUBSET OF NOR EQUAL TO 
      "nsup" : "\u2285", // NOT A SUPERSET OF 
      "nsupE" : "\u2AC6\u0338", // SUPERSET OF ABOVE EQUALS SIGN with slash 
      "nsupe" : "\u2289", // NEITHER A SUPERSET OF NOR EQUAL TO 
      "nVDash" : "\u22AF", // NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE 
      "nVdash" : "\u22AE", // DOES NOT FORCE 
      "nvDash" : "\u22AD", // NOT TRUE 
      "nvdash" : "\u22AC", // DOES NOT PROVE 
      "prnap" : "\u2AB9", // PRECEDES ABOVE NOT ALMOST EQUAL TO 
      "prnE" : "\u2AB5", // PRECEDES ABOVE NOT EQUAL TO 
      "prnsim" : "\u22E8", // PRECEDES BUT NOT EQUIVALENT TO 
      "scnap" : "\u2ABA", // SUCCEEDS ABOVE NOT ALMOST EQUAL TO 
      "scnE" : "\u2AB6", // SUCCEEDS ABOVE NOT EQUAL TO 
      "scnsim" : "\u22E9", // SUCCEEDS BUT NOT EQUIVALENT TO 
      "subnE" : "\u2ACB", // SUBSET OF ABOVE NOT EQUAL TO 
      "subne" : "\u228A", // SUBSET OF WITH NOT EQUAL TO 
      "supnE" : "\u2ACC", // SUPERSET OF ABOVE NOT EQUAL TO 
      "supne" : "\u228B", // SUPERSET OF WITH NOT EQUAL TO 
      "vsubnE" : "\u2ACB\uFE00", // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members 
      "vsubne" : "\u228A\uFE00", // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members 
      "vsupnE" : "\u2ACC\uFE00", // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members 
      "vsupne" : "\u228B\uFE00", // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members 
      "ang" : "\u2220", // ANGLE 
      "angmsd" : "\u2221", // MEASURED ANGLE 
      "beth" : "\u2136", // BET SYMBOL 
      "bprime" : "\u2035", // REVERSED PRIME 
      "comp" : "\u2201", // COMPLEMENT 
      "daleth" : "\u2138", // DALET SYMBOL 
      "ell" : "\u2113", // SCRIPT SMALL L 
      "empty" : "\u2205", // EMPTY SET 
      "gimel" : "\u2137", // GIMEL SYMBOL 
      "inodot" : "\u0131", // LATIN SMALL LETTER DOTLESS I 
      "jnodot" : "\u006A", // LATIN SMALL LETTER J 
      "nexist" : "\u2204", // THERE DOES NOT EXIST 
      "oS" : "\u24C8", // CIRCLED LATIN CAPITAL LETTER S 
      "planck" : "\u210F", // PLANCK CONSTANT OVER TWO PI 
      "real" : "\u211C", // BLACK-LETTER CAPITAL R 
      "sbsol" : "\uFE68", // SMALL REVERSE SOLIDUS 
      "vprime" : "\u2032", // PRIME 
      "weierp" : "\u2118", // SCRIPT CAPITAL P 
      "ape" : "\u224A", // ALMOST EQUAL OR EQUAL TO 
      "asymp" : "\u2248", // ALMOST EQUAL TO 
      "bcong" : "\u224C", // ALL EQUAL TO 
      "bepsi" : "\u03F6", // GREEK REVERSED LUNATE EPSILON SYMBOL 
      "bowtie" : "\u22C8", // BOWTIE 
      "bsim" : "\u223D", // REVERSED TILDE 
      "bsime" : "\u22CD", // REVERSED TILDE EQUALS 
      "bump" : "\u224E", // GEOMETRICALLY EQUIVALENT TO 
      "bumpe" : "\u224F", // DIFFERENCE BETWEEN 
      "cire" : "\u2257", // RING EQUAL TO 
      "colone" : "\u2254", // COLON EQUALS 
      "cuepr" : "\u22DE", // EQUAL TO OR PRECEDES 
      "cuesc" : "\u22DF", // EQUAL TO OR SUCCEEDS 
      "cupre" : "\u227C", // PRECEDES OR EQUAL TO 
      "dashv" : "\u22A3", // LEFT TACK 
      "ecir" : "\u2256", // RING IN EQUAL TO 
      "ecolon" : "\u2255", // EQUALS COLON 
      "eDot" : "\u2251", // GEOMETRICALLY EQUAL TO 
      "efDot" : "\u2252", // APPROXIMATELY EQUAL TO OR THE IMAGE OF 
      "egs" : "\u2A96", // SLANTED EQUAL TO OR GREATER-THAN 
      "els" : "\u2A95", // SLANTED EQUAL TO OR LESS-THAN 
      "erDot" : "\u2253", // IMAGE OF OR APPROXIMATELY EQUAL TO 
      "esdot" : "\u2250", // APPROACHES THE LIMIT 
      "fork" : "\u22D4", // PITCHFORK 
      "frown" : "\u2322", // FROWN 
      "gap" : "\u2A86", // GREATER-THAN OR APPROXIMATE 
      "gE" : "\u2267", // GREATER-THAN OVER EQUAL TO 
      "gEl" : "\u2A8C", // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN 
      "gel" : "\u22DB", // GREATER-THAN EQUAL TO OR LESS-THAN 
      "ges" : "\u2A7E", // GREATER-THAN OR SLANTED EQUAL TO 
      "Gg" : "\u22D9", // VERY MUCH GREATER-THAN 
      "gl" : "\u2277", // GREATER-THAN OR LESS-THAN 
      "gsdot" : "\u22D7", // GREATER-THAN WITH DOT 
      "gsim" : "\u2273", // GREATER-THAN OR EQUIVALENT TO 
      "Gt" : "\u226B", // MUCH GREATER-THAN 
      "lap" : "\u2A85", // LESS-THAN OR APPROXIMATE 
      "ldot" : "\u22D6", // LESS-THAN WITH DOT 
      "lE" : "\u2266", // LESS-THAN OVER EQUAL TO 
      "lEg" : "\u2A8B", // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN 
      "leg" : "\u22DA", // LESS-THAN EQUAL TO OR GREATER-THAN 
      "les" : "\u2A7D", // LESS-THAN OR SLANTED EQUAL TO 
      "lg" : "\u2276", // LESS-THAN OR GREATER-THAN 
      "Ll" : "\u22D8", // VERY MUCH LESS-THAN 
      "lsim" : "\u2272", // LESS-THAN OR EQUIVALENT TO 
      "Lt" : "\u226A", // MUCH LESS-THAN 
      "ltrie" : "\u22B4", // NORMAL SUBGROUP OF OR EQUAL TO 
      "mid" : "\u2223", // DIVIDES 
      "models" : "\u22A7", // MODELS 
      "pr" : "\u227A", // PRECEDES 
      "prap" : "\u2AB7", // PRECEDES ABOVE ALMOST EQUAL TO 
      "pre" : "\u2AAF", // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN 
      "prsim" : "\u227E", // PRECEDES OR EQUIVALENT TO 
      "rtrie" : "\u22B5", // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO 
      "samalg" : "\u2210", // N-ARY COPRODUCT 
      "sc" : "\u227B", // SUCCEEDS 
      "scap" : "\u2AB8", // SUCCEEDS ABOVE ALMOST EQUAL TO 
      "sccue" : "\u227D", // SUCCEEDS OR EQUAL TO 
      "sce" : "\u2AB0", // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN 
      "scsim" : "\u227F", // SUCCEEDS OR EQUIVALENT TO 
      "sfrown" : "\u2322", // FROWN 
      "smid" : "\u2223", // DIVIDES 
      "smile" : "\u2323", // SMILE 
      "spar" : "\u2225", // PARALLEL TO 
      "sqsub" : "\u228F", // SQUARE IMAGE OF 
      "sqsube" : "\u2291", // SQUARE IMAGE OF OR EQUAL TO 
      "sqsup" : "\u2290", // SQUARE ORIGINAL OF 
      "sqsupe" : "\u2292", // SQUARE ORIGINAL OF OR EQUAL TO 
      "ssmile" : "\u2323", // SMILE 
      "Sub" : "\u22D0", // DOUBLE SUBSET 
      "subE" : "\u2AC5", // SUBSET OF ABOVE EQUALS SIGN 
      "Sup" : "\u22D1", // DOUBLE SUPERSET 
      "supE" : "\u2AC6", // SUPERSET OF ABOVE EQUALS SIGN 
      "thkap" : "\u2248", // ALMOST EQUAL TO 
      "thksim" : "\u223C", // TILDE OPERATOR 
      "trie" : "\u225C", // DELTA EQUAL TO 
      "twixt" : "\u226C", // BETWEEN 
      "Vdash" : "\u22A9", // FORCES 
      "vDash" : "\u22A8", // TRUE 
      "vdash" : "\u22A2", // RIGHT TACK 
      "veebar" : "\u22BB", // XOR 
      "vltri" : "\u22B2", // NORMAL SUBGROUP OF 
      "vprop" : "\u221D", // PROPORTIONAL TO 
      "vrtri" : "\u22B3", // CONTAINS AS NORMAL SUBGROUP 
      "Vvdash" : "\u22AA", // TRIPLE VERTICAL BAR RIGHT TURNSTILE 
      "boxDL" : "\u2557", // BOX DRAWINGS DOUBLE DOWN AND LEFT 
      "boxDl" : "\u2556", // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE 
      "boxdL" : "\u2555", // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE 
      "boxdl" : "\u2510", // BOX DRAWINGS LIGHT DOWN AND LEFT 
      "boxDR" : "\u2554", // BOX DRAWINGS DOUBLE DOWN AND RIGHT 
      "boxDr" : "\u2553", // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE 
      "boxdR" : "\u2552", // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE 
      "boxdr" : "\u250C", // BOX DRAWINGS LIGHT DOWN AND RIGHT 
      "boxH" : "\u2550", // BOX DRAWINGS DOUBLE HORIZONTAL 
      "boxh" : "\u2500", // BOX DRAWINGS LIGHT HORIZONTAL 
      "boxHD" : "\u2566", // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL 
      "boxHd" : "\u2564", // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE 
      "boxhD" : "\u2565", // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE 
      "boxhd" : "\u252C", // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL 
      "boxHU" : "\u2569", // BOX DRAWINGS DOUBLE UP AND HORIZONTAL 
      "boxHu" : "\u2567", // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE 
      "boxhU" : "\u2568", // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE 
      "boxhu" : "\u2534", // BOX DRAWINGS LIGHT UP AND HORIZONTAL 
      "boxUL" : "\u255D", // BOX DRAWINGS DOUBLE UP AND LEFT 
      "boxUl" : "\u255C", // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE 
      "boxuL" : "\u255B", // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE 
      "boxul" : "\u2518", // BOX DRAWINGS LIGHT UP AND LEFT 
      "boxUR" : "\u255A", // BOX DRAWINGS DOUBLE UP AND RIGHT 
      "boxUr" : "\u2559", // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE 
      "boxuR" : "\u2558", // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE 
      "boxur" : "\u2514", // BOX DRAWINGS LIGHT UP AND RIGHT 
      "boxV" : "\u2551", // BOX DRAWINGS DOUBLE VERTICAL 
      "boxv" : "\u2502", // BOX DRAWINGS LIGHT VERTICAL 
      "boxVH" : "\u256C", // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL 
      "boxVh" : "\u256B", // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE 
      "boxvH" : "\u256A", // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE 
      "boxvh" : "\u253C", // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL 
      "boxVL" : "\u2563", // BOX DRAWINGS DOUBLE VERTICAL AND LEFT 
      "boxVl" : "\u2562", // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE 
      "boxvL" : "\u2561", // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE 
      "boxvl" : "\u2524", // BOX DRAWINGS LIGHT VERTICAL AND LEFT 
      "boxVR" : "\u2560", // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT 
      "boxVr" : "\u255F", // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE 
      "boxvR" : "\u255E", // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE 
      "boxvr" : "\u251C", // BOX DRAWINGS LIGHT VERTICAL AND RIGHT 
      "Acy" : "\u0410", // CYRILLIC CAPITAL LETTER A 
      "acy" : "\u0430", // CYRILLIC SMALL LETTER A 
      "Bcy" : "\u0411", // CYRILLIC CAPITAL LETTER BE 
      "bcy" : "\u0431", // CYRILLIC SMALL LETTER BE 
      "CHcy" : "\u0427", // CYRILLIC CAPITAL LETTER CHE 
      "chcy" : "\u0447", // CYRILLIC SMALL LETTER CHE 
      "Dcy" : "\u0414", // CYRILLIC CAPITAL LETTER DE 
      "dcy" : "\u0434", // CYRILLIC SMALL LETTER DE 
      "Ecy" : "\u042D", // CYRILLIC CAPITAL LETTER E 
      "ecy" : "\u044D", // CYRILLIC SMALL LETTER E 
      "Fcy" : "\u0424", // CYRILLIC CAPITAL LETTER EF 
      "fcy" : "\u0444", // CYRILLIC SMALL LETTER EF 
      "Gcy" : "\u0413", // CYRILLIC CAPITAL LETTER GHE 
      "gcy" : "\u0433", // CYRILLIC SMALL LETTER GHE 
      "HARDcy" : "\u042A", // CYRILLIC CAPITAL LETTER HARD SIGN 
      "hardcy" : "\u044A", // CYRILLIC SMALL LETTER HARD SIGN 
      "Icy" : "\u0418", // CYRILLIC CAPITAL LETTER I 
      "icy" : "\u0438", // CYRILLIC SMALL LETTER I 
      "IEcy" : "\u0415", // CYRILLIC CAPITAL LETTER IE 
      "iecy" : "\u0435", // CYRILLIC SMALL LETTER IE 
      "IOcy" : "\u0401", // CYRILLIC CAPITAL LETTER IO 
      "iocy" : "\u0451", // CYRILLIC SMALL LETTER IO 
      "Jcy" : "\u0419", // CYRILLIC CAPITAL LETTER SHORT I 
      "jcy" : "\u0439", // CYRILLIC SMALL LETTER SHORT I 
      "Kcy" : "\u041A", // CYRILLIC CAPITAL LETTER KA 
      "kcy" : "\u043A", // CYRILLIC SMALL LETTER KA 
      "KHcy" : "\u0425", // CYRILLIC CAPITAL LETTER HA 
      "khcy" : "\u0445", // CYRILLIC SMALL LETTER HA 
      "Lcy" : "\u041B", // CYRILLIC CAPITAL LETTER EL 
      "lcy" : "\u043B", // CYRILLIC SMALL LETTER EL 
      "Mcy" : "\u041C", // CYRILLIC CAPITAL LETTER EM 
      "mcy" : "\u043C", // CYRILLIC SMALL LETTER EM 
      "Ncy" : "\u041D", // CYRILLIC CAPITAL LETTER EN 
      "ncy" : "\u043D", // CYRILLIC SMALL LETTER EN 
      "numero" : "\u2116", // NUMERO SIGN 
      "Ocy" : "\u041E", // CYRILLIC CAPITAL LETTER O 
      "ocy" : "\u043E", // CYRILLIC SMALL LETTER O 
      "Pcy" : "\u041F", // CYRILLIC CAPITAL LETTER PE 
      "pcy" : "\u043F", // CYRILLIC SMALL LETTER PE 
      "Rcy" : "\u0420", // CYRILLIC CAPITAL LETTER ER 
      "rcy" : "\u0440", // CYRILLIC SMALL LETTER ER 
      "Scy" : "\u0421", // CYRILLIC CAPITAL LETTER ES 
      "scy" : "\u0441", // CYRILLIC SMALL LETTER ES 
      "SHCHcy" : "\u0429", // CYRILLIC CAPITAL LETTER SHCHA 
      "shchcy" : "\u0449", // CYRILLIC SMALL LETTER SHCHA 
      "SHcy" : "\u0428", // CYRILLIC CAPITAL LETTER SHA 
      "shcy" : "\u0448", // CYRILLIC SMALL LETTER SHA 
      "SOFTcy" : "\u042C", // CYRILLIC CAPITAL LETTER SOFT SIGN 
      "softcy" : "\u044C", // CYRILLIC SMALL LETTER SOFT SIGN 
      "Tcy" : "\u0422", // CYRILLIC CAPITAL LETTER TE 
      "tcy" : "\u0442", // CYRILLIC SMALL LETTER TE 
      "TScy" : "\u0426", // CYRILLIC CAPITAL LETTER TSE 
      "tscy" : "\u0446", // CYRILLIC SMALL LETTER TSE 
      "Ucy" : "\u0423", // CYRILLIC CAPITAL LETTER U 
      "ucy" : "\u0443", // CYRILLIC SMALL LETTER U 
      "Vcy" : "\u0412", // CYRILLIC CAPITAL LETTER VE 
      "vcy" : "\u0432", // CYRILLIC SMALL LETTER VE 
      "YAcy" : "\u042F", // CYRILLIC CAPITAL LETTER YA 
      "yacy" : "\u044F", // CYRILLIC SMALL LETTER YA 
      "Ycy" : "\u042B", // CYRILLIC CAPITAL LETTER YERU 
      "ycy" : "\u044B", // CYRILLIC SMALL LETTER YERU 
      "YUcy" : "\u042E", // CYRILLIC CAPITAL LETTER YU 
      "yucy" : "\u044E", // CYRILLIC SMALL LETTER YU 
      "Zcy" : "\u0417", // CYRILLIC CAPITAL LETTER ZE 
      "zcy" : "\u0437", // CYRILLIC SMALL LETTER ZE 
      "ZHcy" : "\u0416", // CYRILLIC CAPITAL LETTER ZHE 
      "zhcy" : "\u0436", // CYRILLIC SMALL LETTER ZHE 
      "DJcy" : "\u0402", // CYRILLIC CAPITAL LETTER DJE 
      "djcy" : "\u0452", // CYRILLIC SMALL LETTER DJE 
      "DScy" : "\u0405", // CYRILLIC CAPITAL LETTER DZE 
      "dscy" : "\u0455", // CYRILLIC SMALL LETTER DZE 
      "DZcy" : "\u040F", // CYRILLIC CAPITAL LETTER DZHE 
      "dzcy" : "\u045F", // CYRILLIC SMALL LETTER DZHE 
      "GJcy" : "\u0403", // CYRILLIC CAPITAL LETTER GJE 
      "gjcy" : "\u0453", // CYRILLIC SMALL LETTER GJE 
      "Iukcy" : "\u0406", // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I 
      "iukcy" : "\u0456", // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 
      "Jsercy" : "\u0408", // CYRILLIC CAPITAL LETTER JE 
      "jsercy" : "\u0458", // CYRILLIC SMALL LETTER JE 
      "Jukcy" : "\u0404", // CYRILLIC CAPITAL LETTER UKRAINIAN IE 
      "jukcy" : "\u0454", // CYRILLIC SMALL LETTER UKRAINIAN IE 
      "KJcy" : "\u040C", // CYRILLIC CAPITAL LETTER KJE 
      "kjcy" : "\u045C", // CYRILLIC SMALL LETTER KJE 
      "LJcy" : "\u0409", // CYRILLIC CAPITAL LETTER LJE 
      "ljcy" : "\u0459", // CYRILLIC SMALL LETTER LJE 
      "NJcy" : "\u040A", // CYRILLIC CAPITAL LETTER NJE 
      "njcy" : "\u045A", // CYRILLIC SMALL LETTER NJE 
      "TSHcy" : "\u040B", // CYRILLIC CAPITAL LETTER TSHE 
      "tshcy" : "\u045B", // CYRILLIC SMALL LETTER TSHE 
      "Ubrcy" : "\u040E", // CYRILLIC CAPITAL LETTER SHORT U 
      "ubrcy" : "\u045E", // CYRILLIC SMALL LETTER SHORT U 
      "YIcy" : "\u0407", // CYRILLIC CAPITAL LETTER YI 
      "yicy" : "\u0457", // CYRILLIC SMALL LETTER YI 
      "acute" : "\u00B4", // ACUTE ACCENT 
      "breve" : "\u02D8", // BREVE 
      "caron" : "\u02C7", // CARON 
      "cedil" : "\u00B8", // CEDILLA 
      "circ" : "\u02C6", // MODIFIER LETTER CIRCUMFLEX ACCENT 
      "dblac" : "\u02DD", // DOUBLE ACUTE ACCENT 
      "die" : "\u00A8", // DIAERESIS 
      "dot" : "\u02D9", // DOT ABOVE 
      "grave" : "\u0060", // GRAVE ACCENT 
      "macr" : "\u00AF", // MACRON 
      "ogon" : "\u02DB", // OGONEK 
      "ring" : "\u02DA", // RING ABOVE 
      "tilde" : "\u02DC", // SMALL TILDE 
      "uml" : "\u00A8", // DIAERESIS 
      "Agr" : "\u0391", // GREEK CAPITAL LETTER ALPHA 
      "agr" : "\u03B1", // GREEK SMALL LETTER ALPHA 
      "Bgr" : "\u0392", // GREEK CAPITAL LETTER BETA 
      "bgr" : "\u03B2", // GREEK SMALL LETTER BETA 
      "Dgr" : "\u0394", // GREEK CAPITAL LETTER DELTA 
      "dgr" : "\u03B4", // GREEK SMALL LETTER DELTA 
      "EEgr" : "\u0397", // GREEK CAPITAL LETTER ETA 
      "eegr" : "\u03B7", // GREEK SMALL LETTER ETA 
      "Egr" : "\u0395", // GREEK CAPITAL LETTER EPSILON 
      "egr" : "\u03B5", // GREEK SMALL LETTER EPSILON 
      "Ggr" : "\u0393", // GREEK CAPITAL LETTER GAMMA 
      "ggr" : "\u03B3", // GREEK SMALL LETTER GAMMA 
      "Igr" : "\u0399", // GREEK CAPITAL LETTER IOTA 
      "igr" : "\u03B9", // GREEK SMALL LETTER IOTA 
      "Kgr" : "\u039A", // GREEK CAPITAL LETTER KAPPA 
      "kgr" : "\u03BA", // GREEK SMALL LETTER KAPPA 
      "KHgr" : "\u03A7", // GREEK CAPITAL LETTER CHI 
      "khgr" : "\u03C7", // GREEK SMALL LETTER CHI 
      "Lgr" : "\u039B", // GREEK CAPITAL LETTER LAMDA 
      "lgr" : "\u03BB", // GREEK SMALL LETTER LAMDA 
      "Mgr" : "\u039C", // GREEK CAPITAL LETTER MU 
      "mgr" : "\u03BC", // GREEK SMALL LETTER MU 
      "Ngr" : "\u039D", // GREEK CAPITAL LETTER NU 
      "ngr" : "\u03BD", // GREEK SMALL LETTER NU 
      "Ogr" : "\u039F", // GREEK CAPITAL LETTER OMICRON 
      "ogr" : "\u03BF", // GREEK SMALL LETTER OMICRON 
      "OHgr" : "\u03A9", // GREEK CAPITAL LETTER OMEGA 
      "ohgr" : "\u03C9", // GREEK SMALL LETTER OMEGA 
      "Pgr" : "\u03A0", // GREEK CAPITAL LETTER PI 
      "pgr" : "\u03C0", // GREEK SMALL LETTER PI 
      "PHgr" : "\u03A6", // GREEK CAPITAL LETTER PHI 
      "phgr" : "\u03C6", // GREEK SMALL LETTER PHI 
      "PSgr" : "\u03A8", // GREEK CAPITAL LETTER PSI 
      "psgr" : "\u03C8", // GREEK SMALL LETTER PSI 
      "Rgr" : "\u03A1", // GREEK CAPITAL LETTER RHO 
      "rgr" : "\u03C1", // GREEK SMALL LETTER RHO 
      "sfgr" : "\u03C2", // GREEK SMALL LETTER FINAL SIGMA 
      "Sgr" : "\u03A3", // GREEK CAPITAL LETTER SIGMA 
      "sgr" : "\u03C3", // GREEK SMALL LETTER SIGMA 
      "Tgr" : "\u03A4", // GREEK CAPITAL LETTER TAU 
      "tgr" : "\u03C4", // GREEK SMALL LETTER TAU 
      "THgr" : "\u0398", // GREEK CAPITAL LETTER THETA 
      "thgr" : "\u03B8", // GREEK SMALL LETTER THETA 
      "Ugr" : "\u03A5", // GREEK CAPITAL LETTER UPSILON 
      "ugr" : "\u03C5", // GREEK SMALL LETTER UPSILON 
      "Xgr" : "\u039E", // GREEK CAPITAL LETTER XI 
      "xgr" : "\u03BE", // GREEK SMALL LETTER XI 
      "Zgr" : "\u0396", // GREEK CAPITAL LETTER ZETA 
      "zgr" : "\u03B6", // GREEK SMALL LETTER ZETA 
      "Aacgr" : "\u0386", // GREEK CAPITAL LETTER ALPHA WITH TONOS 
      "aacgr" : "\u03AC", // GREEK SMALL LETTER ALPHA WITH TONOS 
      "Eacgr" : "\u0388", // GREEK CAPITAL LETTER EPSILON WITH TONOS 
      "eacgr" : "\u03AD", // GREEK SMALL LETTER EPSILON WITH TONOS 
      "EEacgr" : "\u0389", // GREEK CAPITAL LETTER ETA WITH TONOS 
      "eeacgr" : "\u03AE", // GREEK SMALL LETTER ETA WITH TONOS 
      "Iacgr" : "\u038A", // GREEK CAPITAL LETTER IOTA WITH TONOS 
      "iacgr" : "\u03AF", // GREEK SMALL LETTER IOTA WITH TONOS 
      "idiagr" : "\u0390", // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS 
      "Idigr" : "\u03AA", // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA 
      "idigr" : "\u03CA", // GREEK SMALL LETTER IOTA WITH DIALYTIKA 
      "Oacgr" : "\u038C", // GREEK CAPITAL LETTER OMICRON WITH TONOS 
      "oacgr" : "\u03CC", // GREEK SMALL LETTER OMICRON WITH TONOS 
      "OHacgr" : "\u038F", // GREEK CAPITAL LETTER OMEGA WITH TONOS 
      "ohacgr" : "\u03CE", // GREEK SMALL LETTER OMEGA WITH TONOS 
      "Uacgr" : "\u038E", // GREEK CAPITAL LETTER UPSILON WITH TONOS 
      "uacgr" : "\u03CD", // GREEK SMALL LETTER UPSILON WITH TONOS 
      "udiagr" : "\u03B0", // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS 
      "Udigr" : "\u03AB", // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA 
      "udigr" : "\u03CB", // GREEK SMALL LETTER UPSILON WITH DIALYTIKA 
      "alpha" : "\u03B1", // GREEK SMALL LETTER ALPHA 
      "beta" : "\u03B2", // GREEK SMALL LETTER BETA 
      "chi" : "\u03C7", // GREEK SMALL LETTER CHI 
      "Delta" : "\u0394", // GREEK CAPITAL LETTER DELTA 
      "delta" : "\u03B4", // GREEK SMALL LETTER DELTA 
      "epsi" : "\u03F5", // GREEK LUNATE EPSILON SYMBOL 
      "epsis" : "\u03F5", // GREEK LUNATE EPSILON SYMBOL 
      "epsiv" : "\u03B5", // GREEK SMALL LETTER EPSILON 
      "eta" : "\u03B7", // GREEK SMALL LETTER ETA 
      "Gamma" : "\u0393", // GREEK CAPITAL LETTER GAMMA 
      "gamma" : "\u03B3", // GREEK SMALL LETTER GAMMA 
      "gammad" : "\u03DD", // GREEK SMALL LETTER DIGAMMA 
      "iota" : "\u03B9", // GREEK SMALL LETTER IOTA 
      "kappa" : "\u03BA", // GREEK SMALL LETTER KAPPA 
      "kappav" : "\u03F0", // GREEK KAPPA SYMBOL 
      "Lambda" : "\u039B", // GREEK CAPITAL LETTER LAMDA 
      "lambda" : "\u03BB", // GREEK SMALL LETTER LAMDA 
      "mu" : "\u03BC", // GREEK SMALL LETTER MU 
      "nu" : "\u03BD", // GREEK SMALL LETTER NU 
      "Omega" : "\u03A9", // GREEK CAPITAL LETTER OMEGA 
      "omega" : "\u03C9", // GREEK SMALL LETTER OMEGA 
      "Phi" : "\u03A6", // GREEK CAPITAL LETTER PHI 
      "phis" : "\u03D5", // GREEK PHI SYMBOL 
      "phiv" : "\u03C6", // GREEK SMALL LETTER PHI 
      "Pi" : "\u03A0", // GREEK CAPITAL LETTER PI 
      "pi" : "\u03C0", // GREEK SMALL LETTER PI 
      "piv" : "\u03D6", // GREEK PI SYMBOL 
      "Psi" : "\u03A8", // GREEK CAPITAL LETTER PSI 
      "psi" : "\u03C8", // GREEK SMALL LETTER PSI 
      "rho" : "\u03C1", // GREEK SMALL LETTER RHO 
      "rhov" : "\u03F1", // GREEK RHO SYMBOL 
      "Sigma" : "\u03A3", // GREEK CAPITAL LETTER SIGMA 
      "sigma" : "\u03C3", // GREEK SMALL LETTER SIGMA 
      "sigmav" : "\u03C2", // GREEK SMALL LETTER FINAL SIGMA 
      "tau" : "\u03C4", // GREEK SMALL LETTER TAU 
      "Theta" : "\u0398", // GREEK CAPITAL LETTER THETA 
      "thetas" : "\u03B8", // GREEK SMALL LETTER THETA 
      "thetav" : "\u03D1", // GREEK THETA SYMBOL 
      "Upsi" : "\u03D2", // GREEK UPSILON WITH HOOK SYMBOL 
      "upsi" : "\u03C5", // GREEK SMALL LETTER UPSILON 
      "Xi" : "\u039E", // GREEK CAPITAL LETTER XI 
      "xi" : "\u03BE", // GREEK SMALL LETTER XI 
      "zeta" : "\u03B6", // GREEK SMALL LETTER ZETA 
      "b.Gammad" : "\u03DC", // GREEK LETTER DIGAMMA 
      "b.gammad" : "\u03DD", // GREEK SMALL LETTER DIGAMMA 
      "Aacute" : "\u00C1", // LATIN CAPITAL LETTER A WITH ACUTE 
      "aacute" : "\u00E1", // LATIN SMALL LETTER A WITH ACUTE 
      "Acirc" : "\u00C2", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX 
      "acirc" : "\u00E2", // LATIN SMALL LETTER A WITH CIRCUMFLEX 
      "AElig" : "\u00C6", // LATIN CAPITAL LETTER AE 
      "aelig" : "\u00E6", // LATIN SMALL LETTER AE 
      "Agrave" : "\u00C0", // LATIN CAPITAL LETTER A WITH GRAVE 
      "agrave" : "\u00E0", // LATIN SMALL LETTER A WITH GRAVE 
      "Aring" : "\u00C5", // LATIN CAPITAL LETTER A WITH RING ABOVE 
      "aring" : "\u00E5", // LATIN SMALL LETTER A WITH RING ABOVE 
      "Atilde" : "\u00C3", // LATIN CAPITAL LETTER A WITH TILDE 
      "atilde" : "\u00E3", // LATIN SMALL LETTER A WITH TILDE 
      "Auml" : "\u00C4", // LATIN CAPITAL LETTER A WITH DIAERESIS 
      "auml" : "\u00E4", // LATIN SMALL LETTER A WITH DIAERESIS 
      "Ccedil" : "\u00C7", // LATIN CAPITAL LETTER C WITH CEDILLA 
      "ccedil" : "\u00E7", // LATIN SMALL LETTER C WITH CEDILLA 
      "Eacute" : "\u00C9", // LATIN CAPITAL LETTER E WITH ACUTE 
      "eacute" : "\u00E9", // LATIN SMALL LETTER E WITH ACUTE 
      "Ecirc" : "\u00CA", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX 
      "ecirc" : "\u00EA", // LATIN SMALL LETTER E WITH CIRCUMFLEX 
      "Egrave" : "\u00C8", // LATIN CAPITAL LETTER E WITH GRAVE 
      "egrave" : "\u00E8", // LATIN SMALL LETTER E WITH GRAVE 
      "ETH" : "\u00D0", // LATIN CAPITAL LETTER ETH 
      "eth" : "\u00F0", // LATIN SMALL LETTER ETH 
      "Euml" : "\u00CB", // LATIN CAPITAL LETTER E WITH DIAERESIS 
      "euml" : "\u00EB", // LATIN SMALL LETTER E WITH DIAERESIS 
      "Iacute" : "\u00CD", // LATIN CAPITAL LETTER I WITH ACUTE 
      "iacute" : "\u00ED", // LATIN SMALL LETTER I WITH ACUTE 
      "Icirc" : "\u00CE", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX 
      "icirc" : "\u00EE", // LATIN SMALL LETTER I WITH CIRCUMFLEX 
      "Igrave" : "\u00CC", // LATIN CAPITAL LETTER I WITH GRAVE 
      "igrave" : "\u00EC", // LATIN SMALL LETTER I WITH GRAVE 
      "Iuml" : "\u00CF", // LATIN CAPITAL LETTER I WITH DIAERESIS 
      "iuml" : "\u00EF", // LATIN SMALL LETTER I WITH DIAERESIS 
      "Ntilde" : "\u00D1", // LATIN CAPITAL LETTER N WITH TILDE 
      "ntilde" : "\u00F1", // LATIN SMALL LETTER N WITH TILDE 
      "Oacute" : "\u00D3", // LATIN CAPITAL LETTER O WITH ACUTE 
      "oacute" : "\u00F3", // LATIN SMALL LETTER O WITH ACUTE 
      "Ocirc" : "\u00D4", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX 
      "ocirc" : "\u00F4", // LATIN SMALL LETTER O WITH CIRCUMFLEX 
      "Ograve" : "\u00D2", // LATIN CAPITAL LETTER O WITH GRAVE 
      "ograve" : "\u00F2", // LATIN SMALL LETTER O WITH GRAVE 
      "Oslash" : "\u00D8", // LATIN CAPITAL LETTER O WITH STROKE 
      "oslash" : "\u00F8", // LATIN SMALL LETTER O WITH STROKE 
      "Otilde" : "\u00D5", // LATIN CAPITAL LETTER O WITH TILDE 
      "otilde" : "\u00F5", // LATIN SMALL LETTER O WITH TILDE 
      "Ouml" : "\u00D6", // LATIN CAPITAL LETTER O WITH DIAERESIS 
      "ouml" : "\u00F6", // LATIN SMALL LETTER O WITH DIAERESIS 
      "szlig" : "\u00DF", // LATIN SMALL LETTER SHARP S 
      "THORN" : "\u00DE", // LATIN CAPITAL LETTER THORN 
      "thorn" : "\u00FE", // LATIN SMALL LETTER THORN 
      "Uacute" : "\u00DA", // LATIN CAPITAL LETTER U WITH ACUTE 
      "uacute" : "\u00FA", // LATIN SMALL LETTER U WITH ACUTE 
      "Ucirc" : "\u00DB", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX 
      "ucirc" : "\u00FB", // LATIN SMALL LETTER U WITH CIRCUMFLEX 
      "Ugrave" : "\u00D9", // LATIN CAPITAL LETTER U WITH GRAVE 
      "ugrave" : "\u00F9", // LATIN SMALL LETTER U WITH GRAVE 
      "Uuml" : "\u00DC", // LATIN CAPITAL LETTER U WITH DIAERESIS 
      "uuml" : "\u00FC", // LATIN SMALL LETTER U WITH DIAERESIS 
      "Yacute" : "\u00DD", // LATIN CAPITAL LETTER Y WITH ACUTE 
      "yacute" : "\u00FD", // LATIN SMALL LETTER Y WITH ACUTE 
      "yuml" : "\u00FF", // LATIN SMALL LETTER Y WITH DIAERESIS 
      "Abreve" : "\u0102", // LATIN CAPITAL LETTER A WITH BREVE 
      "abreve" : "\u0103", // LATIN SMALL LETTER A WITH BREVE 
      "Amacr" : "\u0100", // LATIN CAPITAL LETTER A WITH MACRON 
      "amacr" : "\u0101", // LATIN SMALL LETTER A WITH MACRON 
      "Aogon" : "\u0104", // LATIN CAPITAL LETTER A WITH OGONEK 
      "aogon" : "\u0105", // LATIN SMALL LETTER A WITH OGONEK 
      "Cacute" : "\u0106", // LATIN CAPITAL LETTER C WITH ACUTE 
      "cacute" : "\u0107", // LATIN SMALL LETTER C WITH ACUTE 
      "Ccaron" : "\u010C", // LATIN CAPITAL LETTER C WITH CARON 
      "ccaron" : "\u010D", // LATIN SMALL LETTER C WITH CARON 
      "Ccirc" : "\u0108", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX 
      "ccirc" : "\u0109", // LATIN SMALL LETTER C WITH CIRCUMFLEX 
      "Cdot" : "\u010A", // LATIN CAPITAL LETTER C WITH DOT ABOVE 
      "cdot" : "\u010B", // LATIN SMALL LETTER C WITH DOT ABOVE 
      "Dcaron" : "\u010E", // LATIN CAPITAL LETTER D WITH CARON 
      "dcaron" : "\u010F", // LATIN SMALL LETTER D WITH CARON 
      "Dstrok" : "\u0110", // LATIN CAPITAL LETTER D WITH STROKE 
      "dstrok" : "\u0111", // LATIN SMALL LETTER D WITH STROKE 
      "Ecaron" : "\u011A", // LATIN CAPITAL LETTER E WITH CARON 
      "ecaron" : "\u011B", // LATIN SMALL LETTER E WITH CARON 
      "Edot" : "\u0116", // LATIN CAPITAL LETTER E WITH DOT ABOVE 
      "edot" : "\u0117", // LATIN SMALL LETTER E WITH DOT ABOVE 
      "Emacr" : "\u0112", // LATIN CAPITAL LETTER E WITH MACRON 
      "emacr" : "\u0113", // LATIN SMALL LETTER E WITH MACRON 
      "ENG" : "\u014A", // LATIN CAPITAL LETTER ENG 
      "eng" : "\u014B", // LATIN SMALL LETTER ENG 
      "Eogon" : "\u0118", // LATIN CAPITAL LETTER E WITH OGONEK 
      "eogon" : "\u0119", // LATIN SMALL LETTER E WITH OGONEK 
      "gacute" : "\u01F5", // LATIN SMALL LETTER G WITH ACUTE 
      "Gbreve" : "\u011E", // LATIN CAPITAL LETTER G WITH BREVE 
      "gbreve" : "\u011F", // LATIN SMALL LETTER G WITH BREVE 
      "Gcedil" : "\u0122", // LATIN CAPITAL LETTER G WITH CEDILLA 
      "Gcirc" : "\u011C", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX 
      "gcirc" : "\u011D", // LATIN SMALL LETTER G WITH CIRCUMFLEX 
      "Gdot" : "\u0120", // LATIN CAPITAL LETTER G WITH DOT ABOVE 
      "gdot" : "\u0121", // LATIN SMALL LETTER G WITH DOT ABOVE 
      "Hcirc" : "\u0124", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX 
      "hcirc" : "\u0125", // LATIN SMALL LETTER H WITH CIRCUMFLEX 
      "Hstrok" : "\u0126", // LATIN CAPITAL LETTER H WITH STROKE 
      "hstrok" : "\u0127", // LATIN SMALL LETTER H WITH STROKE 
      "Idot" : "\u0130", // LATIN CAPITAL LETTER I WITH DOT ABOVE 
      "IJlig" : "\u0132", // LATIN CAPITAL LIGATURE IJ 
      "ijlig" : "\u0133", // LATIN SMALL LIGATURE IJ 
      "Imacr" : "\u012A", // LATIN CAPITAL LETTER I WITH MACRON 
      "imacr" : "\u012B", // LATIN SMALL LETTER I WITH MACRON 
      "inodot" : "\u0131", // LATIN SMALL LETTER DOTLESS I 
      "Iogon" : "\u012E", // LATIN CAPITAL LETTER I WITH OGONEK 
      "iogon" : "\u012F", // LATIN SMALL LETTER I WITH OGONEK 
      "Itilde" : "\u0128", // LATIN CAPITAL LETTER I WITH TILDE 
      "itilde" : "\u0129", // LATIN SMALL LETTER I WITH TILDE 
      "Jcirc" : "\u0134", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX 
      "jcirc" : "\u0135", // LATIN SMALL LETTER J WITH CIRCUMFLEX 
      "Kcedil" : "\u0136", // LATIN CAPITAL LETTER K WITH CEDILLA 
      "kcedil" : "\u0137", // LATIN SMALL LETTER K WITH CEDILLA 
      "kgreen" : "\u0138", // LATIN SMALL LETTER KRA 
      "Lacute" : "\u0139", // LATIN CAPITAL LETTER L WITH ACUTE 
      "lacute" : "\u013A", // LATIN SMALL LETTER L WITH ACUTE 
      "Lcaron" : "\u013D", // LATIN CAPITAL LETTER L WITH CARON 
      "lcaron" : "\u013E", // LATIN SMALL LETTER L WITH CARON 
      "Lcedil" : "\u013B", // LATIN CAPITAL LETTER L WITH CEDILLA 
      "lcedil" : "\u013C", // LATIN SMALL LETTER L WITH CEDILLA 
      "Lmidot" : "\u013F", // LATIN CAPITAL LETTER L WITH MIDDLE DOT 
      "lmidot" : "\u0140", // LATIN SMALL LETTER L WITH MIDDLE DOT 
      "Lstrok" : "\u0141", // LATIN CAPITAL LETTER L WITH STROKE 
      "lstrok" : "\u0142", // LATIN SMALL LETTER L WITH STROKE 
      "Nacute" : "\u0143", // LATIN CAPITAL LETTER N WITH ACUTE 
      "nacute" : "\u0144", // LATIN SMALL LETTER N WITH ACUTE 
      "napos" : "\u0149", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE 
      "Ncaron" : "\u0147", // LATIN CAPITAL LETTER N WITH CARON 
      "ncaron" : "\u0148", // LATIN SMALL LETTER N WITH CARON 
      "Ncedil" : "\u0145", // LATIN CAPITAL LETTER N WITH CEDILLA 
      "ncedil" : "\u0146", // LATIN SMALL LETTER N WITH CEDILLA 
      "Odblac" : "\u0150", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE 
      "odblac" : "\u0151", // LATIN SMALL LETTER O WITH DOUBLE ACUTE 
      "OElig" : "\u0152", // LATIN CAPITAL LIGATURE OE 
      "oelig" : "\u0153", // LATIN SMALL LIGATURE OE 
      "Omacr" : "\u014C", // LATIN CAPITAL LETTER O WITH MACRON 
      "omacr" : "\u014D", // LATIN SMALL LETTER O WITH MACRON 
      "Racute" : "\u0154", // LATIN CAPITAL LETTER R WITH ACUTE 
      "racute" : "\u0155", // LATIN SMALL LETTER R WITH ACUTE 
      "Rcaron" : "\u0158", // LATIN CAPITAL LETTER R WITH CARON 
      "rcaron" : "\u0159", // LATIN SMALL LETTER R WITH CARON 
      "Rcedil" : "\u0156", // LATIN CAPITAL LETTER R WITH CEDILLA 
      "rcedil" : "\u0157", // LATIN SMALL LETTER R WITH CEDILLA 
      "Sacute" : "\u015A", // LATIN CAPITAL LETTER S WITH ACUTE 
      "sacute" : "\u015B", // LATIN SMALL LETTER S WITH ACUTE 
      "Scaron" : "\u0160", // LATIN CAPITAL LETTER S WITH CARON 
      "scaron" : "\u0161", // LATIN SMALL LETTER S WITH CARON 
      "Scedil" : "\u015E", // LATIN CAPITAL LETTER S WITH CEDILLA 
      "scedil" : "\u015F", // LATIN SMALL LETTER S WITH CEDILLA 
      "Scirc" : "\u015C", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX 
      "scirc" : "\u015D", // LATIN SMALL LETTER S WITH CIRCUMFLEX 
      "Tcaron" : "\u0164", // LATIN CAPITAL LETTER T WITH CARON 
      "tcaron" : "\u0165", // LATIN SMALL LETTER T WITH CARON 
      "Tcedil" : "\u0162", // LATIN CAPITAL LETTER T WITH CEDILLA 
      "tcedil" : "\u0163", // LATIN SMALL LETTER T WITH CEDILLA 
      "Tstrok" : "\u0166", // LATIN CAPITAL LETTER T WITH STROKE 
      "tstrok" : "\u0167", // LATIN SMALL LETTER T WITH STROKE 
      "Ubreve" : "\u016C", // LATIN CAPITAL LETTER U WITH BREVE 
      "ubreve" : "\u016D", // LATIN SMALL LETTER U WITH BREVE 
      "Udblac" : "\u0170", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE 
      "udblac" : "\u0171", // LATIN SMALL LETTER U WITH DOUBLE ACUTE 
      "Umacr" : "\u016A", // LATIN CAPITAL LETTER U WITH MACRON 
      "umacr" : "\u016B", // LATIN SMALL LETTER U WITH MACRON 
      "Uogon" : "\u0172", // LATIN CAPITAL LETTER U WITH OGONEK 
      "uogon" : "\u0173", // LATIN SMALL LETTER U WITH OGONEK 
      "Uring" : "\u016E", // LATIN CAPITAL LETTER U WITH RING ABOVE 
      "uring" : "\u016F", // LATIN SMALL LETTER U WITH RING ABOVE 
      "Utilde" : "\u0168", // LATIN CAPITAL LETTER U WITH TILDE 
      "utilde" : "\u0169", // LATIN SMALL LETTER U WITH TILDE 
      "Wcirc" : "\u0174", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX 
      "wcirc" : "\u0175", // LATIN SMALL LETTER W WITH CIRCUMFLEX 
      "Ycirc" : "\u0176", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX 
      "ycirc" : "\u0177", // LATIN SMALL LETTER Y WITH CIRCUMFLEX 
      "Yuml" : "\u0178", // LATIN CAPITAL LETTER Y WITH DIAERESIS 
      "Zacute" : "\u0179", // LATIN CAPITAL LETTER Z WITH ACUTE 
      "zacute" : "\u017A", // LATIN SMALL LETTER Z WITH ACUTE 
      "Zcaron" : "\u017D", // LATIN CAPITAL LETTER Z WITH CARON 
      "zcaron" : "\u017E", // LATIN SMALL LETTER Z WITH CARON 
      "Zdot" : "\u017B", // LATIN CAPITAL LETTER Z WITH DOT ABOVE 
      "zdot" : "\u017C", // LATIN SMALL LETTER Z WITH DOT ABOVE 
      "amp" : "\u0026", // AMPERSAND 
      "apos" : "\u0027", // APOSTROPHE 
      "ast" : "\u002A", // ASTERISK 
      "brvbar" : "\u00A6", // BROKEN BAR 
      "bsol" : "\u005C", // REVERSE SOLIDUS 
      "cent" : "\u00A2", // CENT SIGN 
      "colon" : "\u003A", // COLON 
      "comma" : "\u002C", // COMMA 
      "commat" : "\u0040", // COMMERCIAL AT 
      "copy" : "\u00A9", // COPYRIGHT SIGN 
      "curren" : "\u00A4", // CURRENCY SIGN 
      "darr" : "\u2193", // DOWNWARDS ARROW 
      "deg" : "\u00B0", // DEGREE SIGN 
      "divide" : "\u00F7", // DIVISION SIGN 
      "dollar" : "\u0024", // DOLLAR SIGN 
      "equals" : "\u003D", // EQUALS SIGN 
      "excl" : "\u0021", // EXCLAMATION MARK 
      "frac12" : "\u00BD", // VULGAR FRACTION ONE HALF 
      "frac14" : "\u00BC", // VULGAR FRACTION ONE QUARTER 
      "frac18" : "\u215B", // VULGAR FRACTION ONE EIGHTH 
      "frac34" : "\u00BE", // VULGAR FRACTION THREE QUARTERS 
      "frac38" : "\u215C", // VULGAR FRACTION THREE EIGHTHS 
      "frac58" : "\u215D", // VULGAR FRACTION FIVE EIGHTHS 
      "frac78" : "\u215E", // VULGAR FRACTION SEVEN EIGHTHS 
      "gt" : "\u003E", // GREATER-THAN SIGN 
      "half" : "\u00BD", // VULGAR FRACTION ONE HALF 
      "horbar" : "\u2015", // HORIZONTAL BAR 
      "hyphen" : "\u2010", // HYPHEN 
      "iexcl" : "\u00A1", // INVERTED EXCLAMATION MARK 
      "iquest" : "\u00BF", // INVERTED QUESTION MARK 
      "laquo" : "\u00AB", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 
      "larr" : "\u2190", // LEFTWARDS ARROW 
      "lcub" : "\u007B", // LEFT CURLY BRACKET 
      "ldquo" : "\u201C", // LEFT DOUBLE QUOTATION MARK 
      "lowbar" : "\u005F", // LOW LINE 
      "lpar" : "\u0028", // LEFT PARENTHESIS 
      "lsqb" : "\u005B", // LEFT SQUARE BRACKET 
      "lsquo" : "\u2018", // LEFT SINGLE QUOTATION MARK 
      "lt" : "\u003c", // LESS-THAN SIGN 
      "micro" : "\u00B5", // MICRO SIGN 
      "middot" : "\u00B7", // MIDDLE DOT 
      "nbsp" : "\u00A0", // NO-BREAK SPACE 
      "not" : "\u00AC", // NOT SIGN 
      "num" : "\u0023", // NUMBER SIGN 
      "ohm" : "\u2126", // OHM SIGN 
      "ordf" : "\u00AA", // FEMININE ORDINAL INDICATOR 
      "ordm" : "\u00BA", // MASCULINE ORDINAL INDICATOR 
      "para" : "\u00B6", // PILCROW SIGN 
      "percnt" : "\u0025", // PERCENT SIGN 
      "period" : "\u002E", // FULL STOP 
      "plus" : "\u002B", // PLUS SIGN 
      "plusmn" : "\u00B1", // PLUS-MINUS SIGN 
      "pound" : "\u00A3", // POUND SIGN 
      "quest" : "\u003F", // QUESTION MARK 
      "quot" : "\u0022", // QUOTATION MARK 
      "raquo" : "\u00BB", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 
      "rarr" : "\u2192", // RIGHTWARDS ARROW 
      "rcub" : "\u007D", // RIGHT CURLY BRACKET 
      "rdquo" : "\u201D", // RIGHT DOUBLE QUOTATION MARK 
      "reg" : "\u00AE", // REGISTERED SIGN 
      "rpar" : "\u0029", // RIGHT PARENTHESIS 
      "rsqb" : "\u005D", // RIGHT SQUARE BRACKET 
      "rsquo" : "\u2019", // RIGHT SINGLE QUOTATION MARK 
      "sect" : "\u00A7", // SECTION SIGN 
      "semi" : "\u003B", // SEMICOLON 
      "shy" : "\u00AD", // SOFT HYPHEN 
      "sol" : "\u002F", // SOLIDUS 
      "sung" : "\u266A", // EIGHTH NOTE 
      "sup1" : "\u00B9", // SUPERSCRIPT ONE 
      "sup2" : "\u00B2", // SUPERSCRIPT TWO 
      "sup3" : "\u00B3", // SUPERSCRIPT THREE 
      "times" : "\u00D7", // MULTIPLICATION SIGN 
      "trade" : "\u2122", // TRADE MARK SIGN 
      "uarr" : "\u2191", // UPWARDS ARROW 
      "verbar" : "\u007C", // VERTICAL LINE 
      "yen" : "\u00A5", // YEN SIGN 
      "blank" : "\u2423", // OPEN BOX 
      "blk12" : "\u2592", // MEDIUM SHADE 
      "blk14" : "\u2591", // LIGHT SHADE 
      "blk34" : "\u2593", // DARK SHADE 
      "block" : "\u2588", // FULL BLOCK 
      "bull" : "\u2022", // BULLET 
      "caret" : "\u2041", // CARET INSERTION POINT 
      "check" : "\u2713", // CHECK MARK 
      "cir" : "\u25CB", // WHITE CIRCLE 
      "clubs" : "\u2663", // BLACK CLUB SUIT 
      "copysr" : "\u2117", // SOUND RECORDING COPYRIGHT 
      "cross" : "\u2717", // BALLOT X 
      "Dagger" : "\u2021", // DOUBLE DAGGER 
      "dagger" : "\u2020", // DAGGER 
      "dash" : "\u2010", // HYPHEN 
      "diams" : "\u2666", // BLACK DIAMOND SUIT 
      "dlcrop" : "\u230D", // BOTTOM LEFT CROP 
      "drcrop" : "\u230C", // BOTTOM RIGHT CROP 
      "dtri" : "\u25BF", // WHITE DOWN-POINTING SMALL TRIANGLE 
      "dtrif" : "\u25BE", // BLACK DOWN-POINTING SMALL TRIANGLE 
      "emsp" : "\u2003", // EM SPACE 
      "emsp13" : "\u2004", // THREE-PER-EM SPACE 
      "emsp14" : "\u2005", // FOUR-PER-EM SPACE 
      "ensp" : "\u2002", // EN SPACE 
      "female" : "\u2640", // FEMALE SIGN 
      "ffilig" : "\uFB03", // LATIN SMALL LIGATURE FFI 
      "fflig" : "\uFB00", // LATIN SMALL LIGATURE FF 
      "ffllig" : "\uFB04", // LATIN SMALL LIGATURE FFL 
      "filig" : "\uFB01", // LATIN SMALL LIGATURE FI 
      "flat" : "\u266D", // MUSIC FLAT SIGN 
      "fllig" : "\uFB02", // LATIN SMALL LIGATURE FL 
      "frac13" : "\u2153", // VULGAR FRACTION ONE THIRD 
      "frac15" : "\u2155", // VULGAR FRACTION ONE FIFTH 
      "frac16" : "\u2159", // VULGAR FRACTION ONE SIXTH 
      "frac23" : "\u2154", // VULGAR FRACTION TWO THIRDS 
      "frac25" : "\u2156", // VULGAR FRACTION TWO FIFTHS 
      "frac35" : "\u2157", // VULGAR FRACTION THREE FIFTHS 
      "frac45" : "\u2158", // VULGAR FRACTION FOUR FIFTHS 
      "frac56" : "\u215A", // VULGAR FRACTION FIVE SIXTHS 
      "hairsp" : "\u200A", // HAIR SPACE 
      "hearts" : "\u2665", // BLACK HEART SUIT 
      "hellip" : "\u2026", // HORIZONTAL ELLIPSIS 
      "hybull" : "\u2043", // HYPHEN BULLET 
      "incare" : "\u2105", // CARE OF 
      "ldquor" : "\u201E", // DOUBLE LOW-9 QUOTATION MARK 
      "lhblk" : "\u2584", // LOWER HALF BLOCK 
      "loz" : "\u25CA", // LOZENGE 
      "lozf" : "\u29EB", // BLACK LOZENGE 
      "lsquor" : "\u201A", // SINGLE LOW-9 QUOTATION MARK 
      "ltri" : "\u25C3", // WHITE LEFT-POINTING SMALL TRIANGLE 
      "ltrif" : "\u25C2", // BLACK LEFT-POINTING SMALL TRIANGLE 
      "male" : "\u2642", // MALE SIGN 
      "malt" : "\u2720", // MALTESE CROSS 
      "marker" : "\u25AE", // BLACK VERTICAL RECTANGLE 
      "mdash" : "\u2014", // EM DASH 
      "mldr" : "\u2026", // HORIZONTAL ELLIPSIS 
      "natur" : "\u266E", // MUSIC NATURAL SIGN 
      "ndash" : "\u2013", // EN DASH 
      "nldr" : "\u2025", // TWO DOT LEADER 
      "numsp" : "\u2007", // FIGURE SPACE 
      "phone" : "\u260E", // BLACK TELEPHONE 
      "puncsp" : "\u2008", // PUNCTUATION SPACE 
      "rdquor" : "\u201D", // RIGHT DOUBLE QUOTATION MARK 
      "rect" : "\u25AD", // WHITE RECTANGLE 
      "rsquor" : "\u2019", // RIGHT SINGLE QUOTATION MARK 
      "rtri" : "\u25B9", // WHITE RIGHT-POINTING SMALL TRIANGLE 
      "rtrif" : "\u25B8", // BLACK RIGHT-POINTING SMALL TRIANGLE 
      "rx" : "\u211E", // PRESCRIPTION TAKE 
      "sext" : "\u2736", // SIX POINTED BLACK STAR 
      "sharp" : "\u266F", // MUSIC SHARP SIGN 
      "spades" : "\u2660", // BLACK SPADE SUIT 
      "squ" : "\u25A1", // WHITE SQUARE 
      "squf" : "\u25AA", // BLACK SMALL SQUARE 
      "star" : "\u2606", // WHITE STAR 
      "starf" : "\u2605", // BLACK STAR 
      "target" : "\u2316", // POSITION INDICATOR 
      "telrec" : "\u2315", // TELEPHONE RECORDER 
      "thinsp" : "\u2009", // THIN SPACE 
      "uhblk" : "\u2580", // UPPER HALF BLOCK 
      "ulcrop" : "\u230F", // TOP LEFT CROP 
      "urcrop" : "\u230E", // TOP RIGHT CROP 
      "utri" : "\u25B5", // WHITE UP-POINTING SMALL TRIANGLE 
      "utrif" : "\u25B4", // BLACK UP-POINTING SMALL TRIANGLE 
      "vellip" : "\u22EE", // VERTICAL ELLIPSIS 
      "aleph" : "\u2135", // ALEF SYMBOL 
      "and" : "\u2227", // LOGICAL AND 
      "ang90" : "\u221F", // RIGHT ANGLE 
      "angsph" : "\u2222", // SPHERICAL ANGLE 
      "angst" : "\u212B", // ANGSTROM SIGN 
      "ap" : "\u2248", // ALMOST EQUAL TO 
      "becaus" : "\u2235", // BECAUSE 
      "bernou" : "\u212C", // SCRIPT CAPITAL B 
      "bottom" : "\u22A5", // UP TACK 
      "cap" : "\u2229", // INTERSECTION 
      "compfn" : "\u2218", // RING OPERATOR 
      "cong" : "\u2245", // APPROXIMATELY EQUAL TO 
      "conint" : "\u222E", // CONTOUR INTEGRAL 
      "cup" : "\u222A", // UNION 
      "Dot" : "\u00A8", // DIAERESIS 
      "DotDot" : "\u20DC", // COMBINING FOUR DOTS ABOVE 
      "equiv" : "\u2261", // IDENTICAL TO 
      "exist" : "\u2203", // THERE EXISTS 
      "fnof" : "\u0192", // LATIN SMALL LETTER F WITH HOOK 
      "forall" : "\u2200", // FOR ALL 
      "ge" : "\u2265", // GREATER-THAN OR EQUAL TO 
      "hamilt" : "\u210B", // SCRIPT CAPITAL H 
      "iff" : "\u21D4", // LEFT RIGHT DOUBLE ARROW 
      "infin" : "\u221E", // INFINITY 
      "int" : "\u222B", // INTEGRAL 
      "isin" : "\u2208", // ELEMENT OF 
      "lagran" : "\u2112", // SCRIPT CAPITAL L 
      "lang" : "\u2329", // LEFT-POINTING ANGLE BRACKET 
      "lArr" : "\u21D0", // LEFTWARDS DOUBLE ARROW 
      "le" : "\u2264", // LESS-THAN OR EQUAL TO 
      "lowast" : "\u2217", // ASTERISK OPERATOR 
      "minus" : "\u2212", // MINUS SIGN 
      "mnplus" : "\u2213", // MINUS-OR-PLUS SIGN 
      "nabla" : "\u2207", // NABLA 
      "ne" : "\u2260", // NOT EQUAL TO 
      "ni" : "\u220B", // CONTAINS AS MEMBER 
      "notin" : "\u2209", // NOT AN ELEMENT OF 
      "or" : "\u2228", // LOGICAL OR 
      "order" : "\u2134", // SCRIPT SMALL O 
      "par" : "\u2225", // PARALLEL TO 
      "part" : "\u2202", // PARTIAL DIFFERENTIAL 
      "permil" : "\u2030", // PER MILLE SIGN 
      "perp" : "\u22A5", // UP TACK 
      "phmmat" : "\u2133", // SCRIPT CAPITAL M 
      "Prime" : "\u2033", // DOUBLE PRIME 
      "prime" : "\u2032", // PRIME 
      "prop" : "\u221D", // PROPORTIONAL TO 
      "radic" : "\u221A", // SQUARE ROOT 
      "rang" : "\u232A", // RIGHT-POINTING ANGLE BRACKET 
      "rArr" : "\u21D2", // RIGHTWARDS DOUBLE ARROW 
      "sim" : "\u223C", // TILDE OPERATOR 
      "sime" : "\u2243", // ASYMPTOTICALLY EQUAL TO 
      "square" : "\u25A1", // WHITE SQUARE 
      "sub" : "\u2282", // SUBSET OF 
      "sube" : "\u2286", // SUBSET OF OR EQUAL TO 
      "sup" : "\u2283", // SUPERSET OF 
      "supe" : "\u2287", // SUPERSET OF OR EQUAL TO 
      "tdot" : "\u20DB", // COMBINING THREE DOTS ABOVE 
      "there4" : "\u2234", // THEREFORE 
      "tprime" : "\u2034", // TRIPLE PRIME 
      "Verbar" : "\u2016", // DOUBLE VERTICAL LINE 
      "wedgeq" : "\u2259", // ESTIMATES 
      "entities-timestamp" : "40 27 15 6 2 106 1 64 0"
   };
}

HTMLParser.prototype._resolve = function(exp) {
   var value = exp+"";
   var variable = /(\$[a-zA-Z0-9]+)/;
   while (variable.test(value)) {
      value = value.replace(RegExp.$1,this[RegExp.$1]);
   }
   return value.replace(/ /g,"");
}

HTMLParser.prototype._decodeString = function(tidy,value) {
   var newValue = "";
   var matches;
   while (value.length!=0) {
      if ((matches = value.match(this.lexer.Characters))) {
         newValue = newValue+matches[0];
         // remove match from input
         value = value.substring(matches[0].length);
      } else if ((matches = value.match(this.lexer.CharRef))) {
         newValue = newValue+this._charRef2String(matches[1]);
         // remove match from input
         value = value.substring(matches[0].length);
      } else if ((matches = value.match(this.lexer.EntityRef))) {
         var replacement = this.generalEntities[matches[1]];
         if (!replacement) {
            throw "Undefined general entity "+matches[1];
         }
         newValue = newValue+replacement;
         // remove match from input
         value = value.substring(matches[0].length);
      } else if (tidy && value.charAt(0)=='&') {
         newValue = newValue+"&";
         // remove match from input
         value = value.substring(1);
      } else if (tidy && value.charAt(0)=='<') {
         newValue = newValue+"<";
         // remove match from input
         value = value.substring(1);
      } else {
         throw "Syntax error in expanding literal at: "+value;
      }


   }
   return newValue;
}

HTMLParser._charRef2String = function(ref) {
   var start = ref.charAt(0);
   if (start=="x") {
      return String.fromCharCode(parseInt(ref.substring(1),16));
   } else {
      return String.fromCharCode(parseInt(ref));
   }
}

HTMLParser.prototype.parseDocument = function() {
   this.parseElement();
}

HTMLParser.prototype.init = function(document,parent,xml) {
   this.document = document;
   this.level = 0;
   if (!parent) {
      this.parent = document;
   } else {
      this.parent = parent;
      this.level = 1;
   }
   this.input = xml.trim();
}

HTMLParser.prototype.parseElement = function() {
   var matches = this.input.match(this.lexer.StartTag);
   if (matches) {
      this.handleStartElement(matches,false);
      this.input = this.input.substring(matches[0].length);
      this.parseContent();
   } else if ((matches = this.input.match(this.lexer.EmptyTag))) {
      this.handleStartElement(matches,true);
   } else {
      throw "No root element found.";
   }
}

HTMLParser.prototype.parseContent = function() {
   var startLevel = this.level;
   var matches;
   while (this.level!=0 && this.input.length!=0) {
      // match start tag
      if ((matches = this.input.match(this.lexer.StartTag))) {
         this.handleStartElement(matches,false);

      // match end tag
      } else if ((matches = this.input.match(this.lexer.EndTag))) {
         this.handleEndElement(matches);
      
      // match empty tag
      } else if ((matches = this.input.match(this.lexer.EmptyTag))) {
         this.handleStartElement(matches,true);

      // match characters
      } else if ((matches = this.input.match(this.lexer.Characters))) {
         //if (matches[0].trim()!="") {
         this.parent.appendChild(this.document.createTextNode(matches[0]));
	 //}
      } else if ((matches = this.input.match(this.lexer.CharRef))) {
         var text = this._charRef2String(matches[1]);
         this.parent.appendChild(this.document.createTextNode(text));
      } else if ((matches = this.input.match(this.lexer.EntityRef))) {
         var replacement = this.generalEntities[matches[1]];
         if (!replacement) {
            if (!this.tidy) {
               throw "Undefined general entity "+matches[1];
            }
         } else { 
            this.parent.appendChild(this.document.createTextNode(replacement));
         }
      } else if ((matches = this.input.match(this.lexer.Comment))) {
      } else if ((matches = this.input.match(this.lexer.PI))) {
      } else if (this.tidy && this.input.charAt(0)=='&') {
         this.parent.appendChild(this.document.createTextNode("&"));
         // remove match from input
         matches = new Array();
         matches[0] = "&";
      } else if (this.tidy && (matches = this.input.match(this.lexer.CommentStart))) {
         // remove match from input
         this.input = this.input.substring(matches[0].length);
         while (this.input.length!=0) {
            if ((matches = this.input.match(this.lexer.NonDash))) {
               this.input = this.input.substring(matches[0].length);
            } else if ((matches = this.input.match(this.lexer.CommentEnd))) {
               break;
            } else if (this.input.charAt(0)=='-') {
               this.input = this.input.substring(1);
            }
         }
      } else {
        throw "Syntax error at: "+this.input;
      }

      if (this.input.length!=0) {
         // remove match from input
         this.input = this.input.substring(matches[0].length);
      }

   }
   if (this.level>startLevel && !this.tidy) {
      var currentParent = this.parent;
      var names = "";
      while (currentParent.nodeType==1) {
         names += "/"+currentParent.tagName;
         currentParent = currentParent.parentNode;
      }
      throw "Open elements remain and end of parse: "+names;
   }
}

HTMLParser.prototype.handleStartElement = function(matches,empty) {
  var name = matches[1].toLowerCase();
  // Find out if we have a prefix
  var qname = name.match(this.lexer.QName);
  // Construct the namespace decl attribute name
  var nsDecl = "xmlns";
  if (qname[1]) {
     var prefix = qname[1].substring(0,qname[1].length-1);
     nsDecl = nsDecl+":"+prefix;
  }
  //alert("Looking for namespace decl "+nsDecl);
  // Find the namespace decl if it exists
  var current = this.parent;
  var ns = null;
  while (!ns && current && current.nodeType==1) {
     ns = current.getAttribute(nsDecl);
     current = current.parentNode;
  }

  var attData = null;

  // If we have attributes, we may have a local namespace decl for this element
  if (matches[2]) {
     var attData = this.parseAttributes(matches[2].trim());
     if (attData[nsDecl]) {
        ns = attData[nsDecl].value;
     }
  }
  // Default to the XHTML namespace
  if (!ns && this.defaultToXHTML) {
     ns = this.NS;
  }
  //alert(ns);
  var element = this.document.createElementNS(ns,name);
  this.parent.appendChild(element);
  this.parent = element;

  if (attData) {
     for (var qname in attData) {
        var att = attData[qname];
        if (this.tidy && att.name.match(this.lexer.DigitStart)) {
           continue;
        }
        //alert("Attribute: "+att.isNamespace+" "+att.prefix+" "+att.name+" "+att.value);
        if (att.isNamespace) {
           element.setAttributeNS("http://www.w3.org/2000/xmlns/",att.name,att.value);
        } else {
           element.setAttribute(att.name,att.value);
        }
     }
  }

  this.level++;
  if (empty || this.emptyElements[name]) {
     this.parent = this.parent.parentNode;
     this.level--;
  }
}


HTMLParser.prototype.handleEndElement = function(matches) {
   var name = matches[1].toLowerCase();
   if (this.emptyElements[name]) {
      return;
   }
   if (this.level==0 || !this.parent) {
      throw "Unmatched end tag "+name;
   }
   if (this.parent.tagName!=name) {
      if (this.tidy) {
         var currentParent = this.parent;
         var currentLevel = this.level;
         while (currentParent.nodeType==1) {
            if (currentParent.tagName==name) {
               break;
            }
            currentLevel--;
            currentParent = currentParent.parentNode;
         }
         if (currentParent.nodeType==1) {
            this.parent = currentParent;
            this.level = currentLevel;
         } else {
            // just throw away the end tag and hope for the best
         } 
      } else {
         throw "End tag "+name+" does not match start tag "+this.parent.tagName;
      }
   }
   this.parent = this.parent.parentNode;
   this.level--;
}

HTMLParser.prototype.parseAttributes = function(atts) {
   var matches;
   var attData = {};
   while ((matches = atts.match(this.lexer.Attribute))) {
     var name = matches[1].toLowerCase();
     atts = atts.substring(matches[1].length);
     matches = atts.match(this.lexer.Eq);
     atts = atts.substring(matches[0].length);
     matches = atts.match(this.lexer.Literal);
     var qname = name.match(this.lexer.QName);
     var value = this._decodeString(this.tidy,matches[0].replace(/^['"]|['"]$/g,""));
     // There is a prefix
     if (qname[1]) {
        // TODO: this doesn't handle the case where the namespace prefix is
        // different but the namespace is the same
        var prefix = qname[1].substring(0,qname[1].length-1);
        attData[name] = {
           isNS: qname[1]=="xmlns:",
           prefix: prefix,
           name: name,
           value: value
        }
     } else {
        // No prefix
        attData[name] = {
           isNS: false,
           prefix: null,
           name: name,
           value: value
        }
     }
     atts = atts.substring(matches[0].length).trim();
   }
   return attData;
}
